Windows EC2 パフォーマンス問題を AWS サポート自動化ワークフローで診断してみた
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
Windows EC2 インスタンスのパフォーマンスが遅い問題を特定したいことはありませんか?
パフォーマンス低下の原因特定には様々なログの収集方法、パフォーマンス分析手法、OS の知識が必要となります。
今回はパフォーマンスメトリクスに基づいて、最も多くのリソースを使用しているプロセスの特定に役立つ AWS サポート自動化ワークフロー(SAW)をご紹介します。
AWS サポート自動化ワークフロー(SAW)とは
AWS サポートエンジニアリングが過去の問題解決経験から作成した、厳選された Systems Manager セルフサービス自動化ランブックのコレクションです。
これらのランブックは、AWS リソースに関する一般的な問題のトラブルシューティング、診断、修正を容易にしてくれる便利なものです。
ランブックの概要
「AWSSupport-TroubleshootWindowsPerformance」はログのキャプチャから CPU、メモリ、ディスク、およびネットワークのパフォーマンスメトリクスを分析してくれるランブックです。
最も多くのリソースを使用しているプロセスを特定してくれるため、Windows インスタンスで発生中しているパフォーマンス問題のトラブルシューティングに役立ちます。
また、プロセスダンプのキャプチャも行えるため、パフォーマンス低下の潜在的な原因を特定できます。
任意で EC2Rescue ツールをインストールすることもできます。
処理の概要
ランブックで実施している処理の概要を簡単にまとめてみました。
- ターゲットとなる EC2 インスタンスが次のランブック前提条件を満たしているか確認する。
・同じインスタンスをターゲットにした他の実行がないか
・Windows プラットフォームであるか
・Systems Manager によって管理されているか - CaptureProcessDump パラメータが
Highest CPU
またはHighest Memory
の場合はパフォーマンス問題を引き起こしている可能性のあるプロセスのダンプをキャプチャする。 - Windows Performance Monitor カウンターを作成し、パフォーマンスログをキャプチャする。
- キャプチャしたパフォーマンスログを要約する。
- InstallEC2RescueTool パラメータが
Yes
の場合は AWS-ConfigureAWSPackage を使用して最新バージョンの EC2Rescue ツールをインストールする。 - EC2Rescue ツールを使用してログを収集する。
- LogUploadBucketName パラメータを指定している場合は 指定した S3 バケットに対して次の確認をします。
・サーバーサイド暗号化(SSE)を使用しているか
・匿名またはパブリックな読み取り/書き込みアクセス権を持っているか - 指定した S3 バケットに AWS Tools for PowerShell を利用してログをアップロードする。
入力パラメータ
パラメーター | 必須 | 説明 | 備考 |
---|---|---|---|
AutomationAssumeRole | Systems Manager Automation がユーザーに代わってアクションを実行する IAM ロール名 | 指定なしの場合は実行者の権限を使用 | |
CaptureProcessDump | キャプチャするプロセス ダンプの種類 | Highest CPU / Highest Memory / None いずれか | |
LogCaptureDuration | ログのキャプチャ時間(分) | 1〜15 いずれか | |
LogUploadBucketName | ログアップロード先 S3 バケット名 | ||
InstallEC2RescueTool | EC2RescureTool インストールするか | Yes / No いずれか | |
Acknowledgement | ○ | ランブックによって実行される内容に対する同意の確認 | Yes, I understand and acknowledge |
やってみた
CPU に負荷をかけた状態の EC2 インスタンスに対してランブックを実行してみます。
IAM 設定(オートメーション実行ロール)
本ランブックでは Systems Manager Automation がユーザーに代わってアクションを実行できるよう IAM ロールの指定が可能です。
AutomationAssumeRole パラメータとして指定が可能ですが、任意のパラメータとなっています。
最小限の権限で実行すべく、今回は専用のロールを作成し、実施してみました。
ロール名:SSM-TroubleshootWindowsPerformance-Role
◼︎許可ポリシー
- インラインポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ssm:DescribeAutomationExecutions",
"ssm:DescribeInstanceInformation",
"ssm:GetAutomationExecution",
"ssm:ListCommands",
"ssm:ListCommandInvocations",
"ssm:SendCommand",
"s3:GetAccountPublicAccessBlock"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetEncryptionConfiguration",
"s3:GetBucketPublicAccessBlock",
"s3:GetBucketPolicyStatus",
"s3:GetBucketAcl",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::xxxxxxxxxxxx",
"arn:aws:s3:::xxxxxxxxxxxx/*"
]
}
]
}
◼︎信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
IAM 設定(インスタンスロール)
本ランブックでは S3 バケットに AWS Tools for PowerShell を利用してログをアップロードします。
そのため、EC2 インスタンスロールに対して下記のアクションを許可するポリシーが必要となります。
s3:GetObject
s3:PutObject
s3:ListBucket
今回は ターゲットとなる EC2 インスタンスロールに次のポリシーをアタッチしました。
※arn にはアップロード先となる S3 バケット名を指定してください。
◼︎許可ポリシー
- AmazonSSMManagedInstanceCore
- インラインポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::xxxxxxxxxxxx",
"arn:aws:s3:::xxxxxxxxxxxx/*"
]
}
]
}
負荷ツール実行
今回、Windows Sysinternals の「CpuStres」を負荷ツールとして利用しました。
「CpuStres」は以下よりダウンロードできます。
ダウンロードした CPUSTRES.zip
を解凍し、CPUSTRES64.exe
を起動します。
ID 一覧より ID を選択し、右クリックより Activity Level を選択すると負荷が開始されます。
ランブック実行
下記 URL よりドキュメントを開きます。
「オートメーションを実行する」を選択し、次のパラメータを指定します。
- AutomationAssumeRole:SSM-TroubleshootWindowsPerformance-Role
- CaptureProcessDump:Highest CPU
- LogCaptureDuration:5
- LogUploadBucketName:アップロード先となる S3 バケット名
- InstallEC2RescueTool:Yes
- Acknowledgement:Yes, I understand and acknowledge
実行後はランブックが完了するまで待ちます。
ログのキャプチャ時間やインスタンスタイプによっても変わると思いますが、完了まで20分程度要しました。
CaptureProcessDump 出力結果
CaptureProcessDump ステップでは下記の結果が出力されました。
Highest CPU
を指定したため、 CPU 使用率が最も高いプロセスのダンプを取得してくれます。
CpuStres のプロセスである CPUSTRES64 が取得されました。
The instance has enough space to dump impacting process. Currently available space: 55.66 GB is more than minimum required Space. Proceeding further to capture dump.
[PASSED] Dump captured successfully for the process: CPUSTRES64 with ID: 5276.
The dump file will not be deleted by this automation, please manually delete it after analysis.
The dump file location: C:\ProgramData\Amazon\SSM\TroubleshootWindowsPerformance\xxxxx-xxxx-xxxx-xxxx-xxxxxxx\CPUSTRES64_5276_06-18-40.dmp
CapturePerformanceLogs 出力結果
CapturePerformanceLogs ステップでは下記の結果が出力されました。
Windows Performance Recorder (WPR) を使用してパフォーマンスデータを取得してくれます。
また、現在の CPU とメモリ使用率も出力されます。
The instance has enough space to capture performance logs.
WPR capture process is in 'Stopped' state.
Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx was not found.
Attempting to create Performance monitor Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx......
Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx created successfully.
Attempting to start Performance monitor Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx......
Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx started successfully.
Current CPU usage is '79.91'% and Memory usage is '51.29'%
Not both CPU and Memory usage are over 95% at this moment hence continue to capture WPR log.
Starting Windows Performance Recording (WPR) capture process.
Stopping WPR capture process.
WPR capture process is in 'Stopped' state.
The Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx is currently generating logs.
The Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx has finished generating logs and is currently in 'Stopped' state.
Attempting to delete Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx.
Data Collector Set TroubleshootWindowsPerformance_xxxxx-xxxx-xxxx-xxxx-xxxxxxx deleted successfully.
[PASSED] Performance logs are captured successfully inside the folder: C:\ProgramData\Amazon\SSM\TroubleshootWindowsPerformance\xxxxx-xxxx-xxxx-xxxx-xxxxxxx
The captured log files will not be deleted by this automation, please manually delete it after analysis.
SummarizePerformanceLogs 出力結果
SummarizePerformanceLogs ステップでは下記の結果が出力されました。
CPU とメモリ使用率トップ5が出力されます。
ディスクやネットワークインターフェースなどの分析結果は analysis_output.log
を確認する必要があります。
Top 5 Processes which consumed most CPU in percentage as below. If you see a percentage higher than 100 that means the process is using more than one CPU core.
Process Counter Min % Max % Avg %
CPUSTRES64 Processor 132.00 149.00 143.00
System Processor 0.00 24.00 0.31
ssm-document-worker Processor 0.00 12.00 0.06
powershell Processor 0.00 8.00 0.05
WmiPrvSE##1 Processor 0.00 5.00 0.08
Top 5 Processes which consumed most WorkingSet64 memory as below (in MB):
Process Counter Min MB Max MB Avg MB
MsMpEng WorkingSet 157.00 189.00 160.00
svchost##3 WorkingSet 181.00 181.00 181.00
msedge WorkingSet 171.00 171.00 171.00
explorer WorkingSet 170.00 170.00 170.00
dwm##1 WorkingSet 120.00 121.00 120.00
[PASSED] Performance logs summary completed.
For detailed analysis of other metrics such as Disk, Memory, Network Interface, TCPV4, IPV4 and UDPV4, please check the file C:\ProgramData\Amazon\SSM\TroubleshootWindowsPerformance\xxxxx-xxxx-xxxx-xxxx-xxxxxxx\analysis_output.log
You can also analyze the captured Windows Performance Recorder logs as well as Windows Performance monitor logs captured in the same directory.
The analysis_output.log file will not be deleted by this automation, please manually delete it after analysis.
UploadLogResult 出力結果
UploadLogResult ステップでは下記の結果が出力されました。
分析結果やプロセスダンプがアーカイブされ、S3 バケットにアップロードされます。
The log folder has been compressed to C:\ProgramData\Amazon\SSM\TroubleshootWindowsPerformance\Zip\xxxxx-xxxx-xxxx-xxxx-xxxxxxx\TroubleshootWindowsPerformance_i-xxxxxxxxxxxx_xxxxx-xxxx-xxxx-xxxx-xxxxxxx.zip. Uploading the compressed archive to the Amazon S3 bucket...
[PASSED] Log files uploaded to S3 bucket xxxxxxxxxxxx with key C:\ProgramData\Amazon\SSM\TroubleshootWindowsPerformance\Zip\xxxxx-xxxx-xxxx-xxxx-xxxxxxx\TroubleshootWindowsPerformance_i-xxxxxxxxxxxx_xxxxx-xxxx-xxxx-xxxx-xxxxxxx.zip.
The captured log files are still placed in the instance, they won't be deleted by the automation and will need to be deleted manually after troubleshooting.
S3 アクセス権限が不足しており、アップロードに失敗した場合は以下の結果となります。
----------ERROR-------
C:\ProgramData\Amazon\SSM\InstanceData\i-xxxxxxxxxxxx\document\orchestration\xxxxx-xxxx-xxxx-xxxx-xxxxxxx\
awsrunPowerShellScript\0.awsrunPowerShellScript\_script.ps1 : [FAILED] An error occurred when trying to upload C:\Progr
amData\Amazon\SSM\TroubleshootWindowsPerformance\Zip\xxxxx-xxxx-xxxx-xxxx-xxxxxx\TroubleshootWindowsPerformanc
e_i-xxxxxxxxxxxx_4xxxxx-xxxx-xxxx-xxxx-xxxxxx.zip User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/xxxxx/i-xxxxxxxxxxxx is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::xxxxxxxxx/TroubleshootWindowsPerformance_i-xxxxxxxxxxxx_xxxxx-xxxx-xxxx-xxxx-xxxxxxx.zip" because no identity-base
d policy allows the s3:PutObject action. Please check and upload the logs manually after accessing the instance.
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,_script.ps1
failed to run commands: exit status 1
S3 へアップロードされるファイル
ランブック実行後にパラメータに指定した S3 バケットを確認してみました。
収集されたログファイル類は TroubleshootWindowsPerformance_<インスタンス ID>_<オートメーション実行 ID>.zip
という形式のファイル名で保存されます。
ファイルには次の診断、分析結果が含まれています。
- システム情報
- 実行中のプロセスリスト
- TCP コネクション、統計情報
- プロセスダンプ
- ネットワークインターフェイス、LogicalDisk、メモリの統計情報
- Windows Performance Recorder 記録
- Windows トレース レポート
zip ファイルをダウンロードし、解凍してみると、以下ファイルがアーカイブされていました。
./TroubleshootWindowsPerformance_i-xxxxxxxxxxxx_xxxxx-xxxx-xxxx-xxxx-xxxxxxx
├── CPUSTRES64_5276_06-18-40.dmp
├── analysis_output.log
├── i-xxxxxxxxxxxx_EC2Rescue_06-34-44.zip
├── i-xxxxxxxxxxxx_WPR_06-18-51.etl
├── i-xxxxxxxxxxxx_perfmon_06-18-55.blg
├── netsh_ipv4_ipstats.txt
├── netsh_ipv4_tcpconnections.txt
├── netsh_ipv4_tcpstats.txt
├── netsh_ipv6_ipstats.txt
├── netsh_ipv6_tcpstats.txt
├── report.html
├── report.xml
├── report.xsl
├── rules.log
├── sysinfo.txt
├── tasklist.txt
└── tasklist_svc.txt
なお、同様のファイルはターゲットの EC2 インスタンスにて、次のファイルパスにも保存されています。
C:\ProgramData\Amazon\SSM\TroubleshootWindowsPerformance\
まとめ
「AWSSupport-TroubleshootWindowsPerformance」は Windows EC2 インスタンスのパフォーマンス問題を自動的に診断・分析する AWS サポート自動化ワークフローです。
パフォーマンスの問題が発生した場合は、ランブックを実行するのがベストプラクティスです。
CPU、メモリ、ディスク、ネットワークのパフォーマンスメトリクスを収集し、リソースを最も消費しているプロセスを特定してくれます。
プロセスダンプの取得や EC2Rescue ツールのインストールなど、包括的な診断機能を提供しています。
また、収集したログやパフォーマンスデータは S3 バケットに自動的にアップロードすることが可能です。
本記事が誰かのお役に立てれば幸いです。
参考